home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / os2 / ext2_200.zip / EXT2_SRC.ZIP / 32BITS / EXT2-OS2 / FSD32 / FS32_FIL.C < prev    next >
C/C++ Source or Header  |  1996-09-21  |  7KB  |  179 lines

  1. //
  2. // $Header: D:/32bits/ext2-os2/fsd32/RCS/fs32_fileinfo.c,v 1.1 1996/09/21 22:24:57 Willm Exp Willm $
  3. //
  4.  
  5. // 32 bits Linux ext2 file system driver for OS/2 WARP - Allows OS/2 to
  6. // access your Linux ext2fs partitions as normal drive letters.
  7. // Copyright (C) 1995, 1996 Matthieu WILLM
  8. //
  9. // This program is free software; you can redistribute it and/or modify
  10. // it under the terms of the GNU General Public License as published by
  11. // the Free Software Foundation; either version 2 of the License, or
  12. // (at your option) any later version.
  13. //
  14. // This program is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. // GNU General Public License for more details.
  18. //
  19. // You should have received a copy of the GNU General Public License
  20. // along with this program; if not, write to the Free Software
  21. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  22. #ifdef __IBMC__
  23. #pragma strings(readonly)
  24. #endif
  25.  
  26.  
  27. #define INCL_DOS
  28. #define INCL_DOSERRORS
  29. #define INCL_NOPMAPI
  30. #include <os2.h>
  31.  
  32. #include <os2/types.h>
  33. #include <os2/StackToFlat.h>
  34. #include <linux/fs.h>
  35. #include <os2/os2proto.h>
  36. #include <os2/fsd32.h>
  37. #include <os2/DevHlp32.h>
  38. #include <os2/log.h>
  39. #include <os2/trace.h>
  40. #include <os2/errors.h>
  41. #include <os2/files.h>
  42. #include <os2/volume.h>
  43. #include <linux/fs_proto.h>
  44. #include <linux/stat.h>
  45. #include <os2/filefind.h>
  46.  
  47. /*
  48.  * struct fs32_fileinfo_parms {
  49.  *     unsigned short  IOflag;
  50.  *     unsigned short  cbData;
  51.  *     PTR16           pData;
  52.  *     unsigned short  level;
  53.  *     PTR16           psffsd;
  54.  *     PTR16           psffsi;
  55.  *     unsigned short  flag;
  56.  * };
  57.  */
  58. int FS32ENTRY fs32_fileinfo(struct fs32_fileinfo_parms *parms) {
  59.     struct sffsi32 *psffsi;
  60.     union  sffsd32 *psffsd;
  61.     char           *pData;
  62.     int             rc;
  63.     int             rc2;
  64.     UINT32  len;
  65.     PEAOP16 peaop;
  66.     PFEALIST fpFEAList;
  67.     ULONG   PgCount;
  68.     char          lock[12];
  69.  
  70.     parms = __StackToFlat(parms);
  71.  
  72.     if ((rc = DevHlp32_VirtToLin(parms->psffsi, __StackToFlat(&psffsi))) == NO_ERROR) {
  73.         if ((rc = DevHlp32_VirtToLin(parms->psffsd, __StackToFlat(&psffsd))) == NO_ERROR) {
  74.             if ((rc = DevHlp32_VirtToLin(parms->pData, __StackToFlat(&pData))) == NO_ERROR) {
  75.     if ((parms->level != FIL_STANDARD)         &&
  76.         (parms->level != FIL_QUERYEASIZE)      &&
  77.         (parms->level != FIL_QUERYEASFROMLIST) &&
  78.         (parms->level != FIL_QUERYALLEAS)      && // Undocumented level - similar to level 3 but for full EA set
  79.         (parms->level != FIL_LEVEL7)) {
  80.         if ((rc = kernel_printf("FS_FILEINFO() - invalid level %u", parms->level)) != NO_ERROR) {
  81.             return rc;
  82.         } /* end if */
  83.         return ERROR_INVALID_PARAMETER;
  84.     }
  85.  
  86.  
  87.     //
  88.     // Gets the file structure from psffsd
  89.     //
  90.     if (psffsd->f == 0)
  91.         return ERROR_INVALID_PARAMETER;
  92.  
  93.     switch(parms->flag) {
  94.         case FI_SET :
  95.             if (trace_FS_FILEINFO) {
  96.                 kernel_printf("FS_FILEINFO - FI_SET");
  97.             }
  98.  
  99.             rc = NO_ERROR;
  100.             if (Read_Write) {
  101. //                if ((rc = LockUserBuffer(pData, parms->cbData, __StackToFlat(lock), LOCK_READ, &lock_lin)) == NO_ERROR) {
  102.                 if ((rc = DevHlp32_VMLock(VMDHL_LONG | VMDHL_VERIFY, pData, parms->cbData, (void *)-1, __StackToFlat(lock), __StackToFlat(&PgCount))) == NO_ERROR) {
  103.                     if ((rc = fileinfo_to_ino(pData, psffsd->f->f_inode, parms->level, parms->cbData, psffsi)) == NO_ERROR) {
  104.                         /*
  105.                          * Nothing else to do
  106.                          */
  107.                     } else {
  108.                         kernel_printf("fileinfo_to_ino returned %d", rc);
  109.                     }
  110.                     if ((rc2 = DevHlp32_VMUnlock(__StackToFlat(lock))) == NO_ERROR) {
  111.                         /* Nothing else to do */
  112.                     } else {
  113.                         kernel_printf("FS_FILEINFO : VMUnlock() returned %d", rc2);
  114.                         rc = rc2;
  115.                     } /* VMUnlock failed */
  116.                 } else {
  117.                     kernel_printf("FS_FILEINFO : VMLock() returned %d", rc);
  118.                 }
  119.             } else {
  120.                 rc = ERROR_WRITE_PROTECT;
  121.             }
  122.             break;
  123.  
  124.         case FI_RETRIEVE :
  125.             if (trace_FS_FILEINFO) {
  126.                 kernel_printf("FS_FILEINFO - FI_RETRIEVE - lvl = %u - inode %lu )", parms->level, psffsd->f->f_inode->i_ino);
  127.             }
  128.             if ((rc = DevHlp32_VMLock(VMDHL_LONG | VMDHL_VERIFY | VMDHL_WRITE, pData, parms->cbData, (void *)-1, __StackToFlat(lock), __StackToFlat(&PgCount))) == NO_ERROR) {
  129.  
  130.                 if ((parms->level == FIL_QUERYEASFROMLIST) ||
  131.                     (parms->level == FIL_QUERYALLEAS)) {
  132.                     if (parms->cbData >= 4) {
  133.                       peaop = (PEAOP16)pData;
  134. //                    if ((rc = FSH_PROBEBUF(PB_OPWRITE, (pchar)peaop, 4)) != NO_ERROR) {
  135. //                        fs_err(FUNC_FS_FILEINFO, FUNC_FSH_PROBEBUF, rc, THISFILE, __LINE__);
  136. //                        return rc;
  137. //                    } /* end if */
  138.                         if ((rc = DevHlp32_VirtToLin(peaop->fpFEAList, __StackToFlat(&fpFEAList))) == NO_ERROR) {
  139.                             fpFEAList->cbList = 4;
  140.                             rc = NO_ERROR;
  141.                         }
  142.                     } else {
  143.                         rc = ERROR_BUFFER_OVERFLOW;
  144.                     }
  145.                 } else {
  146.                     if ((rc = ino_to_fileinfo(
  147.                                               psffsd->f->f_inode,
  148.                                               pData,
  149.                                               parms->cbData,
  150.                                               __StackToFlat(&len),
  151.                                               parms->level,
  152.                                                0,
  153.                                               0,
  154.                                               0,
  155.                                               0, TYPEOP_FILEINFO)) != NO_ERROR) {
  156.                         fs_log("FS_FILEINFO() - ino_to_fileinfo()");
  157. //                      return rc;
  158.                     }
  159.                 }
  160.                 if ((rc2 = DevHlp32_VMUnlock(__StackToFlat(lock))) == NO_ERROR) {
  161.                 } else {
  162.                     rc = rc2;
  163.                 }
  164.             } /* DevHlp_VMLock */
  165.             break;
  166.  
  167.         default :
  168.             fs_log("FS_FILEINFO() - Unknown flag");
  169.             rc = ERROR_INVALID_PARAMETER;
  170.             break;
  171.     }
  172.  
  173.  
  174.             }
  175.         }
  176.     }
  177.     return rc;
  178. }
  179.